#ifndef VL_UTILS__H_
#define VL_UTILS__H_

#include <memory>
#include <string>
#include <vector>

namespace VL {

/**
 * @Author: CimZzz
 * @Date: 2022-09-08 14:18:12
 * 
 * 终端输入选择项
 */
struct VLSelectItem {
	// 选择项名字
	std::string name;
	// 选择项信息
	std::string info;
	// 选择项数据指针
	std::shared_ptr<void> ptr;
};


/**
 * @Author: CimZzz
 * @Date: 2022-09-08 14:27:41
 * 
 * 选择项数据列表
 */
struct VLSelectList {
	// 选择列表标题
	std::string title;
	// 每页数量
	int perpageCount = 10;
	// 选择项列表
	std::vector<VLSelectItem> items;
};

/**
 * @Author: CimZzz
 * @Date: 2022-10-20 18:03:58
 * 
 * 选择结果
 */
struct VLSelectResult {
	// 选择结果是否为空
	bool isNull;
	// 选项的 name 值
	std::string name;
	// 是否为其他选项
	bool isOtherItem;
	// 选择项数据指针
	std::shared_ptr<void> ptr;
};

/**
 * @Author: CimZzz
 * @Date: 2022-06-23 10:44:54
 * 
 * 工具类
 */
class VLUtils {
private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-23 10:45:14
	 * 
	 * 私有构造方法
	 */
	VLUtils();

public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-07-06 12:06:21
	 * 
	 * 转换为大写字符串
	 * @param str 源字符串
	 * @return 返回字符串
	 */
	static std::string toUpperStr(const std::string& str);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-07-06 12:06:21
	 * 
	 * 转换为小写字符串
	 * @param str 源字符串
	 * @return 返回字符串
	 */
	static std::string toLowerStr(const std::string& str);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-07-04 19:18:42
	 * 
	 * 长整数转字符串
	 * @param number 长整数
	 * @return 转换后的字符串
	 */
	static std::string long2str(int64_t number);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-23 10:46:25
	 * 
	 * 字符串转整数
	 * @param str 字符串
	 * @return 转换后的整数指针
	 * 
	 * @note 如果转换失败返回空指针
	 */
	static std::shared_ptr<int> str2int(std::string& str);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-06-27 18:04:11
	 * 
	 * 字符串转长整数
	 * @param str 字符串
	 * @return 转换后的长整数指针
	 * 
	 * @note 如果转换失败返回空指针
	 */
	static std::shared_ptr<int64_t> str2long(std::string& str);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-08 14:28:12
	 * 
	 * 获取终端选择项
	 * 
	 * @param select 选择列表数据
	 * 
	 * @return 已选择数据
	 */
	static VLSelectResult select(const VLSelectList& select);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-10-20 17:55:53
	 * 
	 * 获取终端选择项
	 * 
	 * @param select 选择列表数据
	 * @param otherItemList 其他列表选项
	 * 
	 * @return 已选择数据
	 */
	static VLSelectResult select(const VLSelectList& select, const std::vector<VLSelectItem>& otherItemList);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-13 11:56:53
	 * 
	 * 获取终端 Y/N 项
	 * 
	 * @param str 描述文本
	 * @param defaultValue 缺省值
	 * 
	 * @return 如果为 Y 则返回 true
	 */
	static bool askFor(const char* str, bool defaultValue = false);
};

}


#endif // VL_UTILS__H_
